package org.example.mq.common;

import java.io.*;

/**
 * Created with IntelliJ IDEA.
 * Description:做渐进主义的改良派,不做完没注意的速成派
 * User: XALEXC
 * Date: 2025-05-12
 * Time: 11:04
 */
// 下列的逻辑,并不仅仅是Message,其他的Java对象,也是可以通过这样的逻辑进行序列化与反序列化的.
    // 如果要想让这个对象能够进行序列化或者反序列化,需要让这个类能够实现 Serializable 接口
public class BinaryTool {
    // 把一个对象序列化成一个字节数组
    public static byte[] toBytes(Object object) throws IOException {
        // 这个流对象相当于一个变长的字节数组.
        // 就可以把 object 序列化的数据给逐渐的写入到 byteArrayOutputStream中,再统一转成 byte[]
        try (ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream()){
            try (ObjectOutputStream objectOutputStream=new ObjectOutputStream(byteArrayOutputStream)){
                // 此处的 writeObject 就会把该对象进行序列化,生成的二进制字节数据,就会写入到ObjectOutputStream中
                // 由于ObjectOutputStream又是关联到了 ByteArrayOutputStream,最终结果就写入到 ByteArrayOutputStream
                objectOutputStream.writeObject(object);
            }
            // 这个操作就是把 byteArrayOutputStream 中持有的二进制数据取出来,转成byte[]
            return byteArrayOutputStream.toByteArray();
        }
    }
    // 把一个字节数组,反序列化成一个对象
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object=null;
        try (ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(data)){
            try (ObjectInputStream objectInputStream=new ObjectInputStream(byteArrayInputStream)){
                // 此处的redaObject,就是从data这个数组中读取数据并进行反序列化
               object=objectInputStream.readObject();
            }
        }
        return object;
    }
}
